#include "mainscene.h"
#include "ui_mainscene.h"
#include "stone.h"
#include <QPainter>
#include <QMouseEvent>
#include <QDebug>
#include <QMessageBox>
#include <firstscene.h>
#include <mypushbutton.h>
#include <QTimer>
#include <QMenuBar>
#include <QPushButton>

mainscene::mainscene(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::mainscene)
{
    ui->setupUi(this);
    //设置固定大小
    setFixedSize(550,700);
    //设置窗口图片
    setWindowIcon(QIcon(":/firstsence.jpg"));
    //设置标题
    setWindowTitle("人人对战主场景");

    //初始化棋子状态
    for(int i=0;i<12;i++)
    {
        sto[i].id=i;
        sto[i].is_dead=false;
    }
    for(int i=0;i<4;i++)
    {
        sto[i].x = startx + i * d;
        sto[i].y = starty;
    }
    sto[4].x = startx;
    sto[4].y = starty + d;
    sto[5].x = startx + d * 3;
    sto[5].y = starty + d;

    sto[6].x = startx;
    sto[6].y = starty + d * 2;
    sto[7].x = startx + d * 3;
    sto[7].y = starty + d * 2;
    for(int i=8;i<12;i++)
    {
        sto[i].x = startx + d * (i-8);
        sto[i].y = starty + d * 3;
    }

    //返回按钮
    MyPushButton * backBtn = new MyPushButton(":/BackButton.png",":/BackButtonSelected.png");
    backBtn->setParent(this);
    //移动到右下角
    backBtn->move(this->width() - backBtn->width(),
                  this->height() - backBtn->height());
    //点击返回
    connect(backBtn,&MyPushButton::clicked,[=](){
        //告诉主场景，我返回了，主场景监听返回按钮
        //延时返回
        QTimer::singleShot(200,this,[=](){
            emit this->chooseSceneBack();
        });
    });
}

void mainscene::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    QPixmap pix;
    //加载图片
    pix.load(":/play.jpg");
    //拉伸图片
    painter.drawPixmap(0,0,this->width(),this->height(),pix);
    //图片太大，需要进行缩放操作
    pix=pix.scaled(pix.width()*1.1,pix.height()*1.1);

    //创建退出游戏按钮
    QPushButton * btn1 = new QPushButton;
    btn1->setParent(this);
    btn1->setText("退出游戏");
    btn1->move(0,595);
    btn1->show();
    //创建进入介绍规则界面的按钮
    QPushButton * btn2 = new QPushButton;
    btn2->setParent(this);
    btn2->setText("详细规则");
    btn2->move(0,635);
    btn2->show();

    //点击按钮 实现退出游戏
    connect(btn1,&QPushButton::clicked,[=](){
        this->close();
    });

    //学习规则界面按钮的创建
    learn_scene = new learn_rule;
    //进入按钮与返回按钮的连接，实现两个场景之间的切换
    connect(btn2,&MyPushButton::clicked,[=](){
        QTimer::singleShot(100,this,[=](){
            //游戏场景隐藏
            this->hide();
            //显示学习规则的场景
            learn_scene->show();

            //监听学习规则场景的返回信号
            connect(learn_scene,&learn_rule::chooseSceneBack,[=](){
                    //学习规则的场景隐藏
                    learn_scene->hide();
                    //游戏场景回归
                    this->show();
                }
            );
        });
    });

    //画棋盘
    for(int i=0;i<5;i++)//横线
    {
        painter.drawLine(QPoint(startx,starty+d*i),QPoint(startx+d*4,starty+d*i));
    }
    for(int i=0;i<5;i++)//竖线
    {
        painter.drawLine(QPoint(startx+d*i,starty),QPoint(startx+d*i,starty+d*4));
    }

    //绘制12颗棋子
    //安排不同画笔、画刷
    QPen pen1(Qt::red);
    QBrush brush1(Qt::red);
    QPen pen2(Qt::black);
    QBrush brush2(Qt::black);
    QPen pen3(Qt::yellow);
    QBrush brush3(Qt::yellow);
    //画棋子
    for(int i=0;i<6;i++)
    {
        if(sto[i].is_dead)//死棋不予理睬
        {
            continue;
        }
        if(sto[i].id==selected_id)
        {
            painter.setPen(pen3);
            painter.setBrush(brush3);
        }
        else
        {
            painter.setPen(pen1);
            painter.setBrush(brush1);
        }
        painter.drawEllipse(sto[i].x+2,sto[i].y+2,d-4,d-4);
    }
    for(int i=6;i<12;i++)
    {
        if(sto[i].is_dead)
        {
            continue;
        }
        if(sto[i].id==selected_id)
        {
            painter.setPen(pen3);
            painter.setBrush(brush3);
        }
        else
        {
            painter.setPen(pen2);
            painter.setBrush(brush2);
        }
        painter.drawEllipse(sto[i].x+2,sto[i].y+2,80-4,80-4);
    }

}

void mainscene::mousePressEvent(QMouseEvent *event)
{
    int row = -1,col = -1;
    if(event->button() == Qt::LeftButton)
    {
        //鼠标点击位置对应棋盘的行列值
        row=(event->y()-starty)/d;
        col=(event->x()-startx)/d;
    }
    //选中棋子的行列值
    int row2=(sto[selected_id].y-starty)/d;
    int col2=(sto[selected_id].x-startx)/d;
    if(is_selected)//有棋子被选中
    {
        if(!canMove(row,col)) //判断是否出界
        {
            QMessageBox::warning(this,"注意棋盘范围","暗度陈仓？想得美！");
        }
        else if(!canMove2(row,row2,col,col2)) //判断是否飞棋
        {
            QMessageBox::warning(this,"不能一次性走多格","干啥，开挂呢？");
        }
        else if(!canMove3(row,col,selected_id)) //判断是否想直接吃子
        {
            QMessageBox::warning(this,"你不能直接吃子","哪有你这么玩的？");
        }
        else //没有违反规则
        {
            if(selected_id>=0 && selected_id<6)//已选中上方棋子
            {
                for(int i=0;i<6;i++)
                {
                    //如果又选中了自己方的棋子，说明要换
                    if(row==(sto[i].y-starty)/d //横坐标相等
                            && (col==(sto[i].x-startx)/d //纵坐标相等
                            && sto[i].is_dead==false)) //没有死
                    {
                        //更新所选棋子
                        selected_id = i;
                        lastid = i;
                        is_selected = true;
                        update();
                        return;
                    }
                }
            }
            else //已选中下方棋子
            {
                for(int i=6;i<12;i++)
                {
                    //如果又选中了自己方的棋子，说明要换
                    if(row==(sto[i].y-starty)/d //横坐标相等
                            && col==(sto[i].x-startx)/d //纵坐标相等
                            && sto[i].is_dead==false) //没有死
                    {
                        //更新所选棋子
                        selected_id = i;
                        lastid = i;
                        is_selected = true;
                        update();
                        return;
                    }
                }
            }
            //千辛万苦，可以行棋了
            sto[selected_id].x = startx + col * d;
            sto[selected_id].y = starty + row * d;
            update();
            chizi(sto,selected_id);
            //还原成未选状态
            is_selected = false;
            selected_id = -1;
        }
        update();
    }
    else//没有棋子被选中
    {
        //判断这个行列值上有无棋子
        if(lastid>=0 && lastid<6) //前一步是上方棋子在走
        {
            for(int i=6;i<12;i++)
            {
                if((sto[i].y-starty)/d==row && (sto[i].x-startx)/d==col && sto[i].is_dead==false)
                {
                    //记录下来
                    selected_id = i;
                    lastid = i;
                    is_selected = true;
                    update();
                }
            }
        }
        else if(lastid>=6 && lastid<12)//前一步是下方棋子在走
        {
            for(int i=0;i<6;i++)
            {
                if((sto[i].y-starty)/d==row && (sto[i].x-startx)/d==col && sto[i].is_dead==false)
                {
                    //记录下来
                    selected_id = i;
                    lastid = i;
                    is_selected = true;
                    update();
                }
            }
        }
    }
}

bool mainscene::canMove(int x,int y)
{
    if(x<0 || x>3 || y<0 || y>3)
    {
        return false;
    }
    return true;
}

bool mainscene::canMove2(int row,int row2,int col,int col2)
{
    int num=abs(row-row2)*10 + abs(col-col2);
    if(num==1 || num==10)
        return true;
    return false;
}

bool mainscene::canMove3(int row,int col,int select_id)
{
    if(select_id>=0 && select_id<6)//选中上方棋子
    {
        for(int i=6;i<12;i++)//遍历下方棋子
        {
            if((sto[i].y-starty)/d==row && (sto[i].x-startx)/d==col)
            {
                if(sto[i].is_dead==false)
                {
                    return false;
                }
            }
        }
    }
    else//选中下方棋子
    {
        for(int i=0;i<6;i++)//遍历上方棋子
        {
            if((sto[i].y-starty)/d==row && (sto[i].x-startx)/d==col)
            {
                if(sto[i].is_dead==false)
                {
                    return false;
                }
            }
        }
    }
    return true;
}

void mainscene::chizi(stone sto[],int moveid)
{
    int rowarr[12], colarr[12];//分别存储每颗棋子在棋盘上的横纵坐标
    for(int i=0;i<12;i++)
    {
        rowarr[i] = (sto[i].y - starty) / d;
        colarr[i] = (sto[i].x - startx) / d;
    }
    int count_row = 0, count_col = 0;//记录该行该列上各有几颗棋子
    int row = (sto[moveid].y - starty) / d;
    int col = (sto[moveid].x - startx) / d;
    for(int i=0 ; i<12 ; i++)
    {
        if(sto[i].is_dead == true)
        {
            continue;
        }
        if(rowarr[i]==row)
        {
            count_row++;
        }
        if(colarr[i]==col)
        {
            count_col++;
        }
    }
    if(count_row==3)//这一行有机会
    {
        if(moveid>=0 && moveid<6) //移动的是1至6号棋子
        {
            for(int i=0;i<6;i++)//遍历找一下这一行的活盟友
            {
                if(sto[i].is_dead)
                {
                    continue;
                }
                if(colarr[i]-col == 1 && rowarr[i]==row) //右边有盟友
                {
                    for(int j=6;j<12;j++)//看一下左边一格或右边两格有无敌子
                    {
                        if(sto[j].is_dead)
                        {
                            continue;
                        }
                        if(colarr[j]-col == -1 && rowarr[j]==row)//找到了
                        {
                            sto[j].is_dead = true;//直接判其死刑
                        }
                        if(colarr[j]-col == 2 && rowarr[j]==row)//找到了
                        {
                            sto[j].is_dead = true;//直接判其死刑
                        }
                    }
                }
                if(colarr[i]-col == -1 && rowarr[i]==row)//左边有盟友
                {
                    for(int j=6;j<12;j++)//看一下左边两格或右边一格有无敌子
                    {
                        if(sto[j].is_dead)
                        {
                            continue;
                        }
                        if(colarr[j]-col == 1 && rowarr[j]==row)//找到了
                        {
                            sto[j].is_dead = true;//直接判其死刑
                        }
                        if(colarr[j]-col == -2 && rowarr[j]==row)//找到了
                        {
                            sto[j].is_dead = true;//直接判其死刑
                        }
                    }
                }
            }
        }
        if(moveid>=6 && moveid<12)//移动的是7至12号棋子
        {
            for(int i=6;i<12;i++)//遍历找一下这一行的活盟友
            {
                if(sto[i].is_dead)
                {
                    continue;
                }
                if(colarr[i]-col == 1 && rowarr[i]==row)//右边有盟友
                {
                    for(int j=0;j<6;j++)//看一下左边一格或右边两格有无敌子
                    {
                        if(sto[j].is_dead)
                        {
                            continue;
                        }
                        if(colarr[j]-col == -1 && rowarr[j]==row)//找到了
                        {
                            sto[j].is_dead = true;//直接判其死刑
                        }
                        if(colarr[j]-col == 2 && rowarr[j]==row)//找到了
                        {
                            sto[j].is_dead = true;//直接判其死刑
                        }
                    }
                }
                if(colarr[i]-col == -1 && rowarr[i]==row)//左边有盟友
                {
                    for(int j=0;j<6;j++)//看一下左边两格或右边一格有无敌子
                    {
                        if(sto[j].is_dead)
                        {
                            continue;
                        }
                        if(colarr[j]-col == 1 && rowarr[j]==row)//找到了
                        {
                            sto[j].is_dead = true;//直接判其死刑
                        }
                        if(colarr[j]-col == -2 && rowarr[j]==row)//找到了
                        {
                            sto[j].is_dead = true;//直接判其死刑
                        }
                    }
                }
            }
        }
    }
    if(count_col==3)//这一列有机会
    {
        if(moveid>=0 && moveid<6) //移动的是1至6号棋子
        {
            for(int i=0;i<6;i++)//遍历找一下这一列的盟友
            {
                if(sto[i].is_dead)
                {
                    continue;
                }
                if(rowarr[i]-row == 1 && colarr[i]==col)//下边有盟友
                {
                    for(int j=6;j<12;j++)//看一下上边一格或下边两格有无敌子
                    {
                        if(sto[j].is_dead)
                        {
                            continue;
                        }
                        if(rowarr[j]==row-1 && colarr[j]==col)//找到了
                        {
                            sto[j].is_dead = true;//直接判其死刑
                        }
                        if(rowarr[j]==row+2 && colarr[j]==col)//找到了
                        {
                            sto[j].is_dead = true;//直接判其死刑
                        }
                    }
                }
                if(rowarr[i]-row == -1 && colarr[i]==col)//上边有盟友
                {
                    for(int j=6;j<12;j++)//看一下上边两格或下边一格有无敌子
                    {
                        if(sto[j].is_dead)
                        {
                            continue;
                        }
                        if(rowarr[j]==row+1 && colarr[j]==col)//找到了
                        {
                            sto[j].is_dead = true;//直接判其死刑
                        }
                        if(rowarr[j]==row-2 && colarr[j]==col)//找到了
                        {
                            sto[j].is_dead = true;//直接判其死刑
                        }
                    }
                }
            }
        }
        if(moveid>=6 && moveid<12)//移动的是7至12号棋子
        {
            for(int i=6;i<12;i++)//遍历找一下这一列的盟友
            {
                if(sto[i].is_dead)
                {
                    continue;
                }
                if(rowarr[i]-row == 1 && colarr[i]==col)//下边有盟友
                {
                    for(int j=0;j<6;j++)//看一下上边一格或下边两格有无敌子
                    {
                        if(sto[j].is_dead)
                        {
                            continue;
                        }
                        if(rowarr[j]==row-1 && colarr[j]==col)//找到了
                        {
                            sto[j].is_dead = true;//直接判其死刑
                        }
                        if(rowarr[j]==row+2 && colarr[j]==col)//找到了
                        {
                            sto[j].is_dead = true;//直接判其死刑
                        }
                    }
                }
                if(rowarr[i]-row == -1 && colarr[i]==col)//上边有盟友
                {
                    for(int j=0;j<6;j++)//看一下上边两格或下边一格有无敌子
                    {
                        if(sto[j].is_dead)
                        {
                            continue;
                        }
                        if(rowarr[j]==row+1 && colarr[j]==col)//找到了
                        {
                            sto[j].is_dead = true;//直接判其死刑
                        }
                        if(rowarr[j]==row-2 && colarr[j]==col)//找到了
                        {
                            sto[j].is_dead = true;//直接判其死刑
                        }
                    }
                }
            }
        }
    }
}

bool mainscene::isWin()
{
    bool flag1=false;
    for(int i=0;i<6;i++)
    {
        if(!sto[i].is_dead)
        {
            flag1=true;
            break;
        }
    }
    bool flag2=false;
    for(int i=6;i<12;i++)
    {
        if(!sto[i].is_dead)
        {
            flag2=true;
            break;
        }
    }
    if(flag1==false || flag2==false)
    {
        return true;
    }
    return false;
}

mainscene::~mainscene()
{
    delete ui;
}
